package com.hb.concert;

import com.hb.interfaces.CriticismEngine;
import org.springframework.beans.factory.annotation.Autowired;

// 虽然 Spring AOP 能够满足许多应用的切面需求，但是与 AspectJ 相比，Spring AOP 是一个功能比较弱的 AOP 解决方案。AspectJ 提供了 Spring AOP 所不能支持的许多类型的切点。
// 例如，当我们需要在创建对象时应用通知，构造器切点就非常方便。不像某些其他面向对象语言中的构造器，Java 构造器不同于其他的正常方法。这使得 Spring 基于代理的 AOP 无法把通知
// 应用于对象的创建过程。
public aspect CriticAspect {
    public CriticAspect() { }

    private CriticismEngine criticismEngine;

    // 这里可以借助 Spring 的依赖注入把 bean 装配进 AspectJ 切面中
    public void setCriticismEngine(CriticismEngine criticismEngine) {
        this.criticismEngine = criticismEngine;
    }

    pointcut performance() : execution(* com.hb.concert.Performance.perform(..));

    after() : performance() {
        System.out.println(criticismEngine.getCriticism());
    }
}
